#ifndef __TCPCONNECTION_H__
#define __TCPCONNECTION_H__

#include "InetAddress.h"
#include "SocketIO.h"
#include "Socket.h"
#include <memory>
#include <functional>
#include "EventLoop.h"

using namespace std;

class TcpConnection
:public enable_shared_from_this<TcpConnection>
{
public:
    explicit TcpConnection(int fd,EventLoop* eventloop);

    ~TcpConnection();

    string receive();

    void send(const string &msg);
    
    void sendInLoop(const string& msg);

    // 为了方便调试的函数
    string toString();

private:
    // 获取本端地址
    InetAddress getLocalAddr();

    // 获取对端地址
    InetAddress getPeerAddr();

public:
    // 三个回调的注册
    void setNewConnectionCallback(const TcpConnectionCallback &cb);
    void setMessageCallback(const TcpConnectionCallback &cb);
    void setCloseCallback(const TcpConnectionCallback &cb);

    // 三个回调的执行
    void handleNewConnectionCallback();
    void handleMessageCallback();
    void handleCloseCallback();

    // 连接是否断开了
    bool isClose();  

private:
    SocketIO _sockIO;
    
    // 为了调试而加入的三个数据成员
    Socket _sock;
    InetAddress _localAddr;  // 本端地址
    InetAddress _peerAddr;   // 对端地址

private:
    // 三个回调函数的对象
    TcpConnectionCallback _onNewConnection;  // 连接建立
    TcpConnectionCallback _onMessage;   // 消息到达（文件描述符可读）
    TcpConnectionCallback _onClose;     // 连接断开

    EventLoop* _eventloop;  // 让Tcpconnection知道EventLoop的存在
};

#endif 